チュートリアルを通してCodeBuildを理解する #reinvent
はじめに
こんにちは、中山です。
米国時間12/1(木)のキーノートで発表されたCodeBuild。発表当初は北部バージニアリージョンでなぜか上手く表示してくれなかったのですが、お昼頃には使えるようになっていました。早速使ってみたのでレポートします。
使ってみた
やはり新サービスが出てきたらまずはGetting Startedでしょう、ということでCodeBuildのGetting Startedドキュメントに沿ってCodeBuildを使ってみます。このドキュメントではApache Mavenを利用してS3に保存したJavaのソースコードからjarファイルを生成し、アーティファクト用S3バケットに設置するといった内容になっています。では、早速初めてみましょう。
1. S3バケットの用意
事前にアーティファクト保存用/ソースコード保存用バケットをS3に作成しておきます。今回は以下2つのバケット名にしてみました。適宜変更してください。
- アーティファクト保存用: knakayama-codebuild-demo-output
- ソースコード保存用: knakayama-codebuild-demo-input
注意点としてCodeBuildを利用するリージョンとこれらバケットのリージョンは合わせておく必要があります。今回は北部バージニアリージョンでCodeBuildを利用するので2つのバケットもそのリージョンで作成します。
# 環境変数の変更 $ export AWS_DEFAULT_REGION=us-east-1 # バケットの作成 $ aws s3 mb s3://knakayama-codebuild-output make_bucket: knakayama-codebuild-output $ aws s3 mb s3://knakayama-codebuild-input make_bucket: knakayama-codebuild-input
2. CodeBuildでビルドするソースコードの用意
続いてソースコードを用意します。まずはコードを設置するディレクトリを作成しておきます。
$ mkdir -p codebuild-demo/src/{main,test}/java $ cd codebuild-demo
ドキュメントにサンプル用ソースコードがあるのでそれを利用します。
# クラスファイルの作成 $ $EDITOR src/main/java/MessageUtil.java # 以下を貼り付け public class MessageUtil { private String message; public MessageUtil(String message) { this.message = message; } public String printMessage() { System.out.println(message); return message; } public String salutationMessage() { message = "Hi!" + message; System.out.println(message); return message; } } # テストファイルの作成 $ $EDITOR src/test/java/TestMessageUtil.java # 以下を貼り付け import org.junit.Test; import org.junit.Ignore; import static org.junit.Assert.assertEquals; public class TestMessageUtil { String message = "Robert"; MessageUtil messageUtil = new MessageUtil(message); @Test public void testPrintMessage() { System.out.println("Inside testPrintMessage()"); assertEquals(message,messageUtil.printMessage()); } @Test public void testSalutationMessage() { System.out.println("Inside testSalutationMessage()"); message = "Hi!" + "Robert"; assertEquals(message,messageUtil.salutationMessage()); } } # pom.xmlの作成 $ $EDITOR pom.xml # 以下を貼り付け ;se <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>messageUtil</artifactId> <version>1.0</version> <packaging>jar</packaging> <name>Message Utility Java Sample App</name> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies> </project>
最終的なディレクトリ構造は以下のようになります。
codebuild-demo/ ├── pom.xml └── src ├── main │ └── java │ └── MessageUtil.java └── test └── java └── TestMessageUtil.java 5 directories, 3 files
3. buildspec.yml
ファイルの用意
速報エントリでも書きましたが、CodeBuildはビルド時に実行するシェルコマンドを buildspec.yml
(ビルドスペック)というYAML形式のファイルに記述します。CircleCIで言えば circle.yml
ファイルのことですね。このファイルをソースコードのトップディレクトリに設置しておくことで、CodeBuildがその内容を読み込み実行するという流れです。ただし、このファイルは必ずしも必要ではなくマネジメントコンソールからアドホックに設定することも可能です。
$ $EDITOR buildspec.yml # 以下を貼り付け version: 0.1 phases: install: commands: - echo Nothing to do in the install phase... pre_build: commands: - echo Nothing to do in the pre_build phase... build: commands: - echo Build started on `date` - mvn install post_build: commands: - echo Build completed on `date` artifacts: type: zip files: - target/messageUtil-1.0.jar
設定内容を以下の記述します。より詳細な情報はこちらのドキュメントを参照してください。
設定 | 意味 | 備考 |
---|---|---|
version |
ビルドスペックのバージョン | 該当ドキュメントはこちらです。現時点2016/12/1の最新バージョンは0.1です。 |
phases |
ビルドの各フェーズでどういったコマンドを実行するか定義する大本のキー | 設定可能なフェーズは install / pre_build / build / post_build の4つです。 |
install |
インストールフェーズで実行するコマンドを定義 | ビルドする前に必要なライブラリなどをここで用意します。 |
pre_build |
ビルド前に実行するコマンドを定義 | 設定ファイルを書き換えたりといったビルド前に実施するちょっとした処理内容を記述する箇所です。 |
build |
ビルドする際に実行するコマンドを定義 | 今回はMavenを利用してビルドしています。 |
post_build |
ビルド後に実行するコマンドを定義 | 例えばGitHubリリースへアップロードするといったビルド後の処理を記述します。 |
artifacts |
ビルド後に生成した成果物(アーティファクト)の設置場所 | type はzipのみ指定可能。 files でCodeBuildでビルドしたアーティファクトのパスを指定します。ワイルドカードも可能です。 |
4. S3に保存するためにzipに固めてアップロードする
トップディレクトリで以下のコマンドを実行してください。注意点としてルートディレクトリは含めずに、その中のファイルやディレクトリを含める必要があります。
$ zip -r ../MessageUtil.zip * adding: buildspec.yml (deflated 56%) adding: pom.xml (deflated 52%) adding: src/ (stored 0%) adding: src/main/ (stored 0%) adding: src/main/java/ (stored 0%) adding: src/main/java/MessageUtil.java (deflated 58%) adding: src/test/ (stored 0%) adding: src/test/java/ (stored 0%) adding: src/test/java/TestMessageUtil.java (deflated 60%)
また、今回はソースコードの設置場所がS3なのでzipで固めたファイルをアップロードしておきます。
$ aws s3 cp ../MessageUtil.zip s3://knakayama-codebuild-input upload: ../MessageUtil.zip to s3://knakayama-codebuild-input/MessageUtil.zip
5. ビルドプロジェクトの作成
準備が整ったのでいよいよCodeBuildの設定です。マネジメントコンソールからCodeBuildの画面を開きます。
「Get Started」をクリックすると以下のように設定画面が開きます。
各種設定内容は以下のように設定してください。
設定 | 内容 | 備考 |
---|---|---|
Project Name | test-prj | |
Source provider | S3 | ソースコードの設置場所。 |
Bucket/S3 Object key | knakayama-codebuild-input/MessageUtil.zip | |
Environment image | Use an image managed by AWS CodeBuild | CodeBuildで起動されるコンテナの指定です。カスタマイズしたものも使えますが、今回はAWSデフォルトのものを利用します。 |
Operating system | Ubuntu | |
Runtime | Java | |
Version | aws/codebuild/java:openjdk-8 | |
Build specification | Use the buildspec.yml in the source code root directory | |
Artifact type | Amazon S3 | |
Artifact name | 空 | buildspec.yml で指定しているため。 |
Bucket name | knakayama-codebuild-output | アーティファクトの設置先バケット名。 |
Role name | 新規で作成 | CodeBuildが各種AWSリソースにアクセスするためのIAM Roleを指定します。今回はビルドプロジェクトの作成と同時に作成します。 |
「Continue」を押下すると以下のようにレビュー画面に遷移します。問題ないようだったら「Save」を押下してビルドプロジェクトを保存します。
6. ビルドの実行
いよいよビルドを実行してみましょう!「Build Projects」に先程作成したプロジェクトがあるので、そのラジオボタンをクリックして「Start build」を押下してください。
今回は何も考えずにそのまま「Start build」を押下してみます。
するとビルドが開始します。しばらく待つとステータスが「Succeeded」と表示されビルドに成功したことが確認できます。
この時点でアーティファクト用S3バケットを見てみると、正常にアーティファクトが保存されていることを確認できます。
$ aws s3 ls s3://knakayama-codebuild-output --recursive 2016-12-01 16:41:08 2065 test-prj/target/messageUtil-1.0.jar
まとめ
いかがだったでしょうか。
今回はチュートリアル通してCodeBuildの概要を理解してみました。やはりフルマネージドなので自分で管理する必要がないという点がありがたいですね。また、ビルド時間に依存しますがCircleCIなどの一般的なSaaSよりはコストが安くなると思われます。次回以降はより踏み込んだ内容をお届けできればと思います。
本エントリがみなさんの参考になれば幸いです。